package com.shujia.mllib

import org.apache.spark.ml.feature.LabeledPoint
import org.apache.spark.ml.linalg
import org.apache.spark.ml.linalg.Vectors

object Demo1DataType {
  def main(args: Array[String]): Unit = {

    /**
      * 稠密向量
      *
      */

    val dense: linalg.Vector = Vectors.dense(Array(1.0, 2.0, 0.0, 0.0, 0.0, 0.0, 0.0, 4.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0))

    println(dense)

    /**
      * 稀疏向量： 只记录不为0的位置，可以节省存储空间
      *
      */

    val sparse: linalg.Vector = Vectors.sparse(19, Array(0, 1, 7, 9), Array(1.0, 2.0, 4.0, 5.0))

    println(sparse)

    /**
      * 稀疏向量和稠密向量所包含的数据都是一样的
      * 可以相互转换
      *
      */

    println(sparse.toDense)

    /**
      * 如果一行数据中0比较多，使用稀疏向量表示，占用空间更少
      *
      */


    /**
      *
      * LabeledPoint: 一条标记数据， 有目标值和特征值组成
      *
      *
      * 再特征工程的时候需要将原始数据转化成标记数据（LabeledPoint），才能将数据带入算法
      *
      */

    val pos1 = LabeledPoint(1.0, Vectors.dense(1.0, 0.0, 3.0))

    val pos2 = LabeledPoint(1.0, Vectors.sparse(3, Array(0, 2), Array(1.0, 3.0)))

    println(pos1)
    println(pos2)

  }

}
